﻿package birdry.utils	{
	
	//	birdry.utils.StringUtil;
	
	
	import flash.events.Event;
	
	public class StringUtil	{
		
		
		public static function getElements( ch: Number ): Array	{
			// 가(0xAC00) 부터 힣(0xd7a3) 까지
			if ( ch < 0xAC00 || ch > 0xd7a3)	{
				// 한글이 아님
				return null;
			}
			/*	초.중.종성 분해
			ch = ch - 0xAC00;
			초성 = ch / (21 * 28);
			중성 = (ch / 28) % 21;
			종성 = ch % 28;
			 */
			ch -= 44032;
			var third:int = ch % 28;
			var returnChar:Array = new Array(int(ch / 588), int((ch / 28) % 21));
			if (third != 0)	{
				returnChar[2] = third;
			}
			return returnChar;
		}
		
		public static function getElementsAtString( str: String ): Array	{
			var cho:Array = [ 0, 1, 3, 6, 7,
									8, 16, 17, 18, 20,
									21, 22, 23, 24, 25,
									26, 27, 28, 29];
			var len:uint = str.length;
			var chars:Array = new Array();
			for ( var i:uint = 0; i < len; ++i)	{
				var char:Array = getElements(str.charCodeAt(i));
				if (char == null)	{
					// 한글이 아니면
					chars.push([str.charCodeAt(i)]);
				}	else	{
					var obj_hangul:Array = new Array();
					for (var u:uint = 0; u < char.length; ++u)	{
						switch(u)	{
							case 0:	// 초성표시
								obj_hangul.push( String.fromCharCode(0x3131 + cho[char[0]]));
							break;
							case 1:	// 초성 + 중성 표시
								obj_hangul.push( String.fromCharCode(0xAC00 + (char[0]*21*28) + (char[1]*28)));
							break;
							default:	// 초성 + 중성 + 종성 표시
								obj_hangul.push( String.fromCharCode(obj_hangul[1].charCodeAt(0) + char[2]));
							break;
						}
					}
					chars.push( obj_hangul );
					
				}
			}
			return chars;
		}
		
		
		/**
		* StringUtil.addDot1000("1000")		-->		"1,000"
		* @param	value	:	String
		* @return
		*/
		public static function addDot1000(value: String): String	{
			var tempArray1:Array = value.split("").reverse();
			var tempArray2:Array = [];
			for(var i:uint=0; i<tempArray1.length; ++i)	{
				tempArray2[i] = tempArray1[i];
				if(i%3 == 0 && i !=0 )	tempArray2[i] += ",";
			}
			return tempArray2.reverse().join("");
		}
		
		
		/**
		* StringUtil.digit(5);	-->		"05";
		* @param	value	:	Number
		* @return
		*/
		public static function digit(value: Number): String	{
			if(value < 10)	return "0" + value;
			else	return "" + value;
		}
		
		/**
		* StringUtil.digit(5);	-->		"05";
		* @param	value	:	Number
		* @return
		*/
		public static function digit00(value: Number): String	{
			if (value < 100)	{
				if (value < 10)	{
					return "00" + value;
				}	else 	{
					return "0" + value;
				}
			}	else 	{
				return "" + value;
			}
		}
		

		/**
		* StringUtil.trim("  aassdd gg  "); --> "aassddgg";
		* @param	value	:	String
		* @return
		*/
		public static function trim(value:String): String	{
			return value.split(" ").join("");
		}
		
		/**
		* StringUtil.trimFront("  aassdd gg  "); --> "aassdd gg  ";
		* @param	value	:	String
		* @return
		*/
		public static function trimFront(value:String): String	{
			var tempArray:Array = value.split("");
			for(var i:int = 0; i<tempArray.length; ++i)	{
				if(isWhitespace(tempArray[i]))	{
					tempArray.splice(i, 1);
					--i;
				}	else	{
					break;
				}
			}
			return tempArray.join("");
		}
		
		/**
		* StringUtil.trimBack("  aassdd gg  "); --> "  aassdd gg";
		* @param	value	:	String
		* @return
		*/
		public static function trimBack(value:String): String	{
			var tempArray:Array = value.split("");
			for(var i:int = tempArray.length - 1; i >= 0 ; --i)	{
				if(isWhitespace(tempArray[i]))	tempArray.splice(i, 1);
				else	break;
			}
			return tempArray.join("");
		}

		/**
		* StringUtil.trimBoth("  aassdd gg  "); --> "aassdd gg";
		* @param	value	:	String
		* @return
		*/
		public static function trimBoth(value:String): String	{
			return trimFront(trimBack(value));
		}

		/**
		* StringUtil.isWhitespace(" ");	-->		"true";
		* @param	value	:	String
		* @return
		*/
		public static function isWhitespace(value:String): Boolean	{
			return 	value == '\r' ||
					value == '\n' ||
					value == '\f' ||
					value == '\t' ||
					value == ' ';
		}
		
		/**
		* StringUtil.replace("aassdd", "dd", "qq"); --> "aassqq";
		* @param	orgString	:	기존 문자
		* @param	oldString	:	바뀌어야 할 기존 문자
		* @param	newString	:	바뀌게 될 기존 문자
		* @return
		*/
		public static function replace(orgString:String, oldString:String, newString:String): String	{
			return orgString.split(oldString).join(newString);
		}
		
		/**
		* StringUtil.reverse("aassddgg"); --> "ggddssaa";
		* @param	value	:	Sting
		* @return
		*/
		public static function reverse(value:String): String	{
			return value.split("").reverse().join("");
		}
		
		/**
		* StringUtil.addZero(55, 3);	-->		"055";
		* @param	value		:	Number
		* @param	stringLen	:	0을 붙일 자릿수
		* @return
		*/
		public static function addZero(value:Number, stringLen:int = 5): String	{
			var str:String = String(value);
			var len:int = stringLen - str.length;
			for(var i:int = 0; i<len; ++i)	{
				str = "0" + str;
			}
			return str;
		}
		
		
		
		/**
		* StringUtil.getByteLength("동해물");	-->		3;
		* @param	str		:	String
		* @return
		*/
		public static function getByteLength(str:String): int	{ 
			var doubleByteSum:int = escape(str).match(/%u/g).length ; 
			var singleByteSum:int = str.length - doubleByteSum ; 
			return (doubleByteSum * 2) + singleByteSum ; 
		}
		
		
		
		/**
		* StringUtil.getByteLength("동해물과백두산이", 3, "...");	-->		동해물...;
		* @param	str			:	기존문자
		* @param	stringLen	:	자를 문자길이
		* @param	add			:	자른뒤 붙일 문자
		* @return
		*/
		public static function splitAddDot(str:String, stringLen:int, add:String): String	{ 
			var tempStr:String;
			if(str.length > stringLen)	{
				tempStr = str.substr(0, stringLen) + add;
			}	else	{
				tempStr = str;
			}
			return tempStr;
		}
		
		
		/**
		 * HTML 태그를 삭제한후 리턴해줍니다.
		 * @param	tarStr	:	태그를 제거할 문자열
		 * @return
		 */
		public static function removeHTML( tarStr : String ) : String
		{
			return tarStr.replace(/<.*?>/g, "");
		}
		
		
		/**
		 * 이메일 형식인지 체크후 Boolean 형식으로 리턴해줍니다.
		 * @param	email	:	체크할 이메일 형식
		 * @return
		 */
		public static function isEmail( email:String ) : Boolean		{
			var emailExpression:RegExp = /^[a-z][\w.-]+@\w[\w.-]+\.[\w.-]*[a-z][a-z]$/i;
			return emailExpression.test( email );
		}
		
		public static function isEmail2( email:String ) : Boolean		{
			var emailExpression:RegExp = /^[\w.-]+\.[\w.-]*[a-z][a-z]$/i;
			return emailExpression.test( email );
		}
		
		
		/**
		 * 금지어를 필터링한 후  리턴해줍니다.
		 * @param	filteringWordsArr	:	타겟배열 ( 금지어배열 )
		 * @param	str					:	타겟문자열(비교할 문자열)
		 * @return
		 */
		public static function filtering( filteringWordsArr : Array , str : String ) :Boolean		{
			for (var i:uint = 0; i <filteringWordsArr.length; i++)			{
				if (str.split(filteringWordsArr[i]).length > 1 )				return true
			}
			return false;
		}
		
		public static function compare(originStr:String, searchStr:String): Boolean		{
			var returnFlag:Boolean;
			searchStr = StringUtil.trimBoth(searchStr);
			for (var i:uint = 0; i < originStr.length; ++i)	{
				if (originStr.substr(i, searchStr.length) == searchStr)	{
					returnFlag = true;
					break;
				}
			}
			return returnFlag;
		}
		
	}	// class
}	// package